class ConcurrentTaskRunner {
  constructor(limit) {
    this.limit = limit; // 窗口大小（最大并发数）
    this.running = 0; // 当前运行的任务数
    this.queue = []; // 任务队列
  }

  // 入队操作：添加任务到队列
  add(task) {
    return new Promise((resolve, reject) => {
      // 将任务和其resolve/reject包装后入队
      this.queue.push({ task, resolve, reject });
      this.run(); // 尝试执行任务
    });
  }

  // 执行任务（滑动窗口核心逻辑）
  run() {
    // 如果窗口已满或队列空，则不执行
    if (this.running >= this.limit || this.queue.length === 0) {
      return;
    }

    // 出队：从队列取出一个任务
    const { task, resolve, reject } = this.queue.shift();
    this.running++;

    // 执行任务
    Promise.resolve(task())
      .then(result => {
        resolve(result);
        this.running--; // 任务完成，窗口腾出位置
        this.run(); // 继续执行下一个任务（窗口滑动）
      })
      .catch(error => {
        reject(error);
        this.running--; // 任务失败，窗口同样腾出位置
        this.run(); // 继续执行下一个任务
      });
  }
}

// 使用示例
const runner = new ConcurrentTaskRunner(2); // 限制最大并发数为2

// 模拟5个异步任务
const tasks = Array.from({ length: 5 }, (_, i) => () => 
  new Promise(resolve => {
    console.log(`任务${i+1}开始执行`);
    setTimeout(() => {
      console.log(`任务${i+1}执行完成`);
      resolve(i+1);
    }, 1000);
  })
);

// 所有任务入队
tasks.forEach(task => runner.add(task));